/**
 * 
 */
package model.facade.persistence.mysql;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.GregorianCalendar;

import model.core.utente.Commissario;
import model.core.utente.Giocatore;
import model.core.utente.GiocatoreInterface;
import model.core.utente.Squadra;
import model.core.utente.Studente;

/**
 * @author Giuseppe Fusco (fusgius19@gmail.com)
 *
 */
public class MySQLUtentiQueryUtility {

	public static int getIdStudente(String matricola, String password, MySQLDBMS mys) throws SQLException{
		ResultSet rt = mys.getResult("select * from studente where (matricola=\""+matricola+"\" and password=\""+password+"\")");
		if(rt.first())
		{
			int n = rt.getInt(1);
			rt.close();
			return n;
		}
		else
		{
			rt.close();
			return -1;
		}
	}

	public static int getIdGiocatorebyIdStudente(Giocatore s, MySQLDBMS mys) {
		int t;
		try {
			t = getIdStudente(s.getMatricola(), s.getPassword(), mys);
			if(t!=-1){
				ResultSet rt = mys.getResult("select * from giocatore where idstudente="+t);
				if(rt.first())
				{
					int n = rt.getInt(1);
					rt.close();
					return n;
				}
				else
				{
					rt.close();
					return -1;
				}
			}
			else
				return -1;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return -1;
		}
	}

	public static int getIdGiocatorebyIdStudente(int t, MySQLDBMS mys) {
		try {
			ResultSet rt = mys.getResult("select * from giocatore where idstudente="+t);
			if(rt.first())
			{
				int n = rt.getInt(1);
				rt.close();
				return n;
			}
			else
			{
				rt.close();
				return -1;
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return -1;
		}
	}
	
	public static int getIdSquadraByNome(String nome, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select idgiocatore from giocatore where nome=\""+nome+"\"");
			if(r.first())
				return r.getInt(1);
			else
				return -1;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return -1;
		}
	}

	public static Studente getStudenteByIdStudente(int id, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from studente where idstudente="+id);
			if(r.first()){
				Studente s = r.getString("tipo").equals("STUDENTE")?new Studente():new Commissario();
				s.setAnno_corso(r.getInt("anno_corso"));
				s.setAnno_immatricolazione(r.getInt("anno_immatricolazione"));
				s.setCognome(r.getString("cognome"));
				s.setMatricola(r.getString("matricola"));
				s.setNome(r.getString("nome"));
				s.setPassword(r.getString("password"));
				GregorianCalendar g = new GregorianCalendar();
				Date d = r.getDate("data_nascita");
				g.setTimeInMillis(d.getTime());
				s.setData_nascita(g);
				g=null;
				d=null;
				return s;
			}
			else return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return null;
		}
	}

	public static Studente getStudente(String matricola, String password, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from studente where (matricola=\""+matricola+"\" and password=\""+password+"\")");
			if(r.first()){
				Studente s = r.getString("tipo").equals("STUDENTE")?new Studente():new Commissario();
				s.setAnno_corso(r.getInt("anno_corso"));
				s.setAnno_immatricolazione(r.getInt("anno_immatricolazione"));
				s.setCognome(r.getString("cognome"));
				s.setMatricola(r.getString("matricola"));
				s.setNome(r.getString("nome"));
				s.setPassword(r.getString("password"));
				GregorianCalendar g = new GregorianCalendar();
				Date d = r.getDate("data_nascita");
				g.setTimeInMillis(d.getTime());
				s.setData_nascita(g);
				g=null;
				d=null;
				return s;
			}
			else return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	public static Giocatore getGiocatoreByIdStudente(int id, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from giocatore where idstudente="+id);
			if(r.first()){

				Studente stu = getStudenteByIdStudente(id, mys);
				Giocatore s = Giocatore.createFromStudente(stu);
				s.setData_nascita(stu.getData_nascita());
				s.setPartite_giocate(r.getInt("partite_giocate"));
				s.setPartite_perse(r.getInt("partite_perse"));
				s.setTotale_punti(r.getInt("totale_punti"));
				s.setPartite_vinte(r.getInt("partite_vinte"));
				stu=null;
				return s;
			}
			else return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return null;
		}
	}

	public static GiocatoreInterface getGiocatoreByIdGiocatore(int id, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from giocatore where idgiocatore="+id);
			if(r.first()){
				if(r.getString("tipo").equals("SINGOLO")){
					Giocatore s = new Giocatore();
					Studente stu = getStudenteByIdStudente(r.getInt("idstudente"), mys);

					s.setAnno_corso(stu.getAnno_corso());
					s.setAnno_immatricolazione(stu.getAnno_immatricolazione());
					s.setCognome(stu.getCognome());
					s.setMatricola(stu.getMatricola());
					s.setNome(stu.getNome());
					s.setPassword(stu.getPassword());
					s.setData_nascita(stu.getData_nascita());
					s.setPartite_giocate(r.getInt("partite_giocate"));
					s.setPartite_perse(r.getInt("partite_perse"));
					s.setTotale_punti(r.getInt("totale_punti"));
					s.setPartite_vinte(r.getInt("partite_vinte"));
					stu=null;
					return s;
				}else if(r.getString("tipo").equals("SQUADRA")){
					Squadra s = new Squadra();
					s.setNome(r.getString("nome"));
					s.setPartite_giocate(r.getInt("partite_giocate"));
					s.setPartite_perse(r.getInt("partite_perse"));
					s.setPartite_vinte(r.getInt("partite_vinte"));
					s.setTotale_punti(r.getInt("totale_punti"));
					s.setCapitano((Giocatore) getGiocatoreByIdGiocatore(r.getInt("capitano"), mys));
					s.setPresidente((Commissario) getStudenteByIdStudente(r.getInt("presidente"), mys));
					ResultSet g = mys.getResult("select * from componenti_squadra where idsquadra="+r.getInt(1));
					ArrayList<Giocatore> gioc = new ArrayList<Giocatore>();
					while(g.next()){
						if(g.getInt("idgiocatore")!=r.getInt("capitano")){
							gioc.add((Giocatore) getGiocatoreByIdGiocatore(g.getInt("idgiocatore"), mys));
						}
					}
					g.close();
					r.close();
					s.setPartecipanti(gioc);
					return s;
				}else
					return null;
				
			}
			else return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return null;
		}
	}

	public static Squadra getSquadraByNome(String nome, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from giocatore where nome=\""+nome+"\"");
			if(r.first()){
				Squadra s = new Squadra();
				s.setNome(nome);
				s.setPartite_giocate(r.getInt("partite_giocate"));
				s.setPartite_perse(r.getInt("partite_perse"));
				s.setPartite_vinte(r.getInt("partite_vinte"));
				s.setTotale_punti(r.getInt("totale_punti"));
				ResultSet g = mys.getResult("select * from componenti_squadra where idsquadra="+r.getInt(1));
				ArrayList<Giocatore> gioc = new ArrayList<Giocatore>();
				while(g.next()){
					//if(g.getInt("idgiocatore")!=r.getInt("capitano")){
						gioc.add((Giocatore) getGiocatoreByIdGiocatore(g.getInt("idgiocatore"), mys));
					//}
				}
				g.close();
				s.setPartecipanti(gioc);
				s.setCapitano((Giocatore) getGiocatoreByIdGiocatore(r.getInt("capitano"), mys));
				s.setPresidente((Commissario) getStudenteByIdStudente(r.getInt("presidente"), mys));
				
				r.close();
				return s;
			}else
				return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	public static Squadra getSquadraByIdSquadra(int id, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select nome from giocatore where idgiocatore="+id);
			r.first();
			return getSquadraByNome(r.getString(1), mys);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return null;
		}
	}
	
	public static int getIdGiocatore(GiocatoreInterface g, MySQLDBMS mys){
		if(g instanceof Giocatore )
			return getIdGiocatorebyIdStudente((Giocatore)g, mys);
		else if(g instanceof Squadra)
			return getIdSquadraByNome(((Squadra)g).getNome(), mys);
		else
			return -1;
	}

}
